// 网络请求模块
import axios from 'axios'
// 按需导入tost
import { Toast } from 'vant'
// 导入storejs数据，访问state的token
import store from '@/store/index.js'
// 导入大数处理插件
import bigInt from 'json-bigint'
import { exchangeTokenApi } from '@/api/userApi.js'
import router from '@/router/index.js'

// 定义一个中间件函数，data就是服务器响应的数据
const trasnBigInt = data => {
    if (!data) return ''
    // 对大数进行转换
    // 大数处理的结果，超范围的数字变成了BigNumber对象了
   return bigInt.parse(data)
}
// 创建axios实例
const instance = axios.create({
    baseURL: 'http://toutiao-app.itheima.net',
    // 通过transformResponse来制定数据处理的中间件
    transformResponse: [trasnBigInt]

})

// 添加拦截器
// 添加请求拦截器
instance.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    // 添加loading
    Toast.loading({
        message: '加载中...',
        duration: 0
    })
    // 在请求前，加上token的值
    const tokenStr = store.state.tokenInfo.token
    // 判断token是否为空
    if (tokenStr) {
        config.headers.Authorization = 'Bearer ' + tokenStr
    }
    return config
}, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
})
// 添加响应拦截器
instance.interceptors.response.use(function (response) {
    // 对响应数据做点什么
    // 清除loading
    Toast.clear()
    return response
}, async function (error) {
    // 对响应错误做点什么
    Toast.clear()

    // 从vuex中获取tokenInfo对象
    const tokenInfo = store.state.tokenInfo
    // 判断是否为token过期导致请求失败
    if (error.response && error.response.status === 401 && tokenInfo.refresh_token) {
        // 进行换取token操作
        try {
            const { data: res } = await exchangeTokenApi(tokenInfo.refresh_token)
        if (res.message === 'OK') {
            console.log(res.data.token)
            // 更新到vuex里
            store.commit('updateTokenInfo', { token: res.data.token, refresh_token: tokenInfo.refresh_token })
            // 在第二个function中，return了一个请求的Promise对象
            // 官方提供的用法
            return instance(error.config)
        }
        } catch {
            // 如果能进入catch中，证明token和refresh_token都过期了
            // 1.清空vuex和localStorage
            store.commit('cleanState')
            // 2.强制跳转登录页
            router.push('/login?pre=' + router.currentRoute.fullPath)
        }
    }
     return Promise.reject(error)
})
// 导出instance
export default instance
